package com.ruoyi.vstac.service.impl;

import java.io.IOException;
import java.util.List;

import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.file.FileTypeUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.vstac.mapper.FileMapper;
import com.ruoyi.vstac.domain.FileInfo;
import com.ruoyi.vstac.service.IFileService;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;

/**
 * 作品文件Service业务层处理
 * 
 * @author kingner
 * @date 2024-07-08
 */
@Service
public class FileServiceImpl implements IFileService 
{
    @Resource
    private FileMapper fileMapper;


    /**
     * 查询作品文件
     * 
     * @param fileId 作品文件主键
     * @return 作品文件
     */
    @Override
    public FileInfo selectFileByFileId(int fileId)
    {
        return fileMapper.selectFileByFileId(fileId);
    }

    /**
     * 查询作品文件列表
     * 
     * @param file 作品文件
     * @return 作品文件
     */
    @Override
    public List<FileInfo> selectFileList(FileInfo file)
    {
        return fileMapper.selectFileList(file);
    }

    public List<FileInfo> selectFileByEntryId(int entryId){
        return fileMapper.selectFileByEntryId(entryId);
    }

    /**
     * 新增作品文件
     * 
     * @param file 作品文件
     * @return 结果
     */
    @Override
    public int insertFile(MultipartFile file,int entryId) throws IOException
    {
        // 初始化文件信息
        FileInfo fileInfo = new FileInfo();
        fileInfo.setEntryId(entryId);
        fileInfo.setCreateTime(DateUtils.getNowDate());
        fileInfo.setFileName(file.getName());
        fileInfo.setFileType(file.getName().substring(file.getName().lastIndexOf(".")+1 ));

        // 获取路径上传文件
        String path = RuoYiConfig.getUploadPath();
        String fileName = FileUploadUtils.upload(path, file);
        fileInfo.setFilePath(fileName);

        // 保存到数据库
        return fileMapper.insertFile(fileInfo);
    }

    /**
     * 修改作品文件
     *
     * @param file 作品文件
     * @return 结果
     */
    @Override
    public int updateFile(MultipartFile file, int fileId) throws IOException {
        // 根据文件id获取文件信息
        FileInfo fileInfo = fileMapper.selectFileByFileId(fileId);
        // 通过文件地址删除文件
        FileUtils.deleteFile(fileInfo.getFilePath());

        // 上传新文件
        String path = RuoYiConfig.getUploadPath();
        String fileName = FileUploadUtils.upload(path, file);
        return fileMapper.updateFile(fileInfo);
    }

    /**
     * 批量删除作品文件
     * 
     * @param fileIds 需要删除的作品文件主键
     * @return 结果
     */
    @Override
    public int deleteFileByFileIds(int[] fileIds)
    {
        // 查询要删除的文件信息
        List<FileInfo> fileInfos = fileMapper.selectFileByIds(fileIds);
        for (FileInfo fileInfo : fileInfos){
            FileUtils.deleteFile(fileInfo.getFilePath()); // 删除本地文件
        }
        // 删除数据库记录
        return fileMapper.deleteFileByFileIds(fileIds);
    }

    /**
     * 删除作品文件信息
     * 
     * @param fileId 作品文件主键
     * @return 结果
     */
    @Override
    public int deleteFileByFileId(int fileId)
    {
        // 获取要删除的文件信息
        FileInfo fileInfo = fileMapper.selectFileByFileId(fileId);
        // 删除本地文件
        FileUtils.deleteFile(fileInfo.getFilePath());
        // 删除数据库记录
        return fileMapper.deleteFileByFileId(fileId);
    }
}
